home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / Source / SCSI / scsi sample.c next >
Text File  |  1992-07-03  |  4KB  |  203 lines

  1. //Matt,
  2.  
  3. //Here a routine that we use. HoldBufferMemory is used to lock memory for VM.
  4.  
  5.  
  6. #include <stdio.h>
  7. #include <scsi.h>
  8. #include <stdlib.h>
  9.  
  10. #include "scsi sample.h"
  11.  
  12. #define HoldBufferMemory(a, b) HoldMemory(a, b)
  13. #define ReleaseBufferMemory(a, b) UnholdMemory(a, b)
  14.  
  15.  
  16. #define kSCSIStatusMask 0x1f
  17.  
  18. #define kGood 0x00
  19. #define kCheckCondition 0x02
  20. #define kBusy 0x08
  21. #define kReservationConflict 0x18
  22.  
  23. #define kSCSIRetryValue 5
  24.  
  25. #define bLogicalUnitLSB 5
  26.  
  27. #define kCommandComplete 0x00
  28. #define kExtendedMessage 0x01
  29. #define kSaveDataPointer 0x02
  30. #define kRestorePointers 0x03
  31. #define kDisconnect 0x04
  32. #define kMessageReject 0x07
  33. #define kLinkedCommandComplete 0x0a
  34. #define kLinkedCommandCompleteWithFlags 0x0b
  35.  
  36.  
  37. enum
  38. {
  39. eSCSIReservationConflict=0xf000,
  40. eSCSIBusy,
  41. eDisconnect,
  42. eMessageReject,
  43. eReplyTOErr
  44. };
  45.  
  46.  
  47. #define DoSCSISenseUnit(TargetSCSIID, LogicalUnit) FindError(TargetSCSIID)
  48.  
  49. //#pragma segment SCSISupport
  50. //CorPascal OSErr 
  51.  
  52. OSErr
  53. DoSCSIOutput(
  54.     short TargetSCSIID, 
  55.     short scsiCmdSize,
  56.     void * scsiCmd,
  57.     SCSIInstr *scsiInst, 
  58.     short RdWrNone, 
  59.     long TimeOut)
  60. {
  61. short  ReturnedSCSIStat;
  62. short  ReturnedSCSIMessage;
  63. short  NumTries = 0;
  64. short  stat;
  65. OSErr  err;
  66. OSErr  err1;
  67. short  i;
  68. short  message;
  69.  
  70.     HoldBufferMemory(scsiCmd, scsiCmdSize);
  71.     HoldBufferMemory(scsiInst, 100);
  72.  
  73.     while (NumTries++ < kSCSIRetryValue) 
  74.         {
  75.            err = SCSIGet();
  76.            
  77.            if (err == noErr) 
  78.                {
  79.                err = SCSISelect(TargetSCSIID);
  80.                if (err == noErr) 
  81.                    {
  82.                    err = SCSICmd((Ptr)(scsiCmd), scsiCmdSize);
  83.                    if (err == noErr) 
  84.                        {
  85.                        stat = SCSIStat();
  86.                        
  87.                        switch (RdWrNone) 
  88.                            {
  89.                            case scsiReadXfer:
  90.                                err = SCSIRead((Ptr)scsiInst);
  91.                                break;
  92.                            
  93.                            case scsiWriteXfer:
  94.                                err = SCSIWrite((Ptr)scsiInst);
  95.                                break;
  96.                            
  97.                            default:
  98.                                break;
  99.                            }
  100.                        }
  101.    
  102.                    err1 = SCSIComplete(&ReturnedSCSIStat, &ReturnedSCSIMessage, TimeOut);
  103.    
  104.                    if (err == noErr) 
  105.                        {
  106.                        if (err1 == noErr) 
  107.                            {
  108.                            switch (ReturnedSCSIStat & kSCSIStatusMask) 
  109.                                {
  110.                                case kGood:
  111.                                    err = noErr;
  112.                                    break;
  113.    
  114. //                               case kConditionMetGood:
  115. //                                   err = noErr;
  116. //                                   break;
  117.    
  118. //                               case kIntermediateGood:
  119. //                                   err = noErr;
  120. //                                   break;
  121.    
  122. //                               case kIntermediateMetGood:
  123. //                                   err = noErr;
  124. //                                   break;
  125.    
  126.                                case kReservationConflict:
  127.                                    err = eSCSIReservationConflict;
  128.                                    break;
  129.    
  130.                                case kBusy:
  131.                                    err = eSCSIBusy;
  132.                                    break;
  133.    
  134.                                case kCheckCondition:
  135.                                    switch (ReturnedSCSIMessage) 
  136.                                        {
  137.  
  138.                                        case kCommandComplete:
  139.                                        case kLinkedCommandCompleteWithFlags:
  140.                                        case kLinkedCommandComplete:
  141.                                            err = DoSCSISenseUnit(TargetSCSIID,
  142.                                                scsiCmd->LUN_Res >> bLogicalUnitLSB);
  143.                                            break;
  144.    
  145.                                        case kExtendedMessage:
  146.                                            if (SCSIMsgIn(&message) == noErr) 
  147.                                                {
  148.                                                for (i = 0; i < message; i++) 
  149.                                                    {
  150.                                                    if (SCSIMsgIn(&message) != noErr) 
  151.                                                        break;
  152.                                                    }
  153.                                                }
  154.                                            break;
  155.    
  156.                                        case kSaveDataPointer:
  157.                                            break;
  158.    
  159.                                        case kRestorePointers:
  160.                                            break;
  161.    
  162.                                        case kDisconnect:
  163.                                            err = eDisconnect;
  164.    
  165.                                        case kMessageReject:
  166.                                            err = eMessageReject;
  167.    
  168.                                        default:
  169.                                            if (ReturnedSCSIMessage >= 0x80) 
  170.                                                {
  171.                                                    err = noErr;
  172.                                                } 
  173.                                            else 
  174.                                                err = DoSCSISenseUnit(TargetSCSIID,
  175.                                                    scsiCmd->LUN_Res >> bLogicalUnitLSB);
  176.                                            break;
  177.                                        }
  178.                                    break;
  179.                                }
  180.                            } 
  181.                        else 
  182.                            err = err1;
  183.                        }
  184.                    break;
  185.                    }
  186.                }
  187.            }
  188.    
  189.        if (NumTries >= kSCSIRetryValue) 
  190.            err = eReplyTOErr;
  191.  
  192.        ReleaseBufferMemory(scsiCmd, scsiCmdSize);
  193.        ReleaseBufferMemory(scsiInst, 100);
  194.  
  195.        return (err);
  196. }
  197.  
  198. //For simple Xfers you don't need the scsi-2 extra processing.
  199.  
  200. //- Tom
  201.  
  202. //Author: D0430
  203.